# -*- coding: utf-8 -*-
# 如果你的程序（包括注释）中包含中文，请加上上面这一行，用于指明编码（utf-8）。
# #号开头的行都是注释。

# 如何编辑本程序：
#     用任何文本编辑器均可编辑。

# 如何运行本程序：
#     在终端中，运行：python p901_plotting.py
#
# 依赖模块：
#     matplotlib  (pip install matplotlib)
#     numpy       (pip install numpy)
#
# matplotlib的主页：https://matplotlib.org/index.html

# 注1：如何查看已安装模块的文档？
#     (1) python -m pydoc -p 8899
#     (2) 用浏览器打开：http://localhost:8899
#
# 注2：使用jupyter notebook开发环境：
#     (1) 运行 jupyter notebook
#     (2) 用浏览器打开：http://localhost:8888
#     (3) 在打开的页面：Files -> New -> notebook: Python3
#

# 一般的绘图只需调用pyplot子模块。
import matplotlib.pyplot as plt

import numpy as np  # 后面会用到

# -------------------------------------------------------------
# 折线图

# 定义两个列表分别作为X轴、Y轴数据
x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
# 第一个列表代表横坐标的值，第二个列表代表纵坐标的值
plt.plot(x_data, y_data)
#plt.plot(y_data)  # X轴缺省使用0、1、2、...
# 调用show()函数显示图形
plt.show()

# 多条折线

y_data2 = [52000, 54200, 51500, 58300, 56800, 59500, 62700]
# 传入两组X、Y，画两条折线
plt.plot(x_data, y_data, x_data, y_data2)
# 或者分两次调用：
# plt.plot(x_data, y_data）
# plt.plot(x_data, y_data2)
plt.show()

# 指定折线的式样和颜色

plt.plot(x_data, y_data, color='red', linewidth=2.0, linestyle='--')
plt.plot(x_data, y_data2, color='blue', linewidth=3.0, linestyle='-.')
# -   ：实线，默认值
# --  ：虚线
# :   ：点线
# -.  ：短线和点相间的虚线
plt.show()

# 添加图例

# 设置绘图模块的参数使之能正确显示中文（标题、图例中的中文）
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False

# plt.plot()返回一个折线列表（即使只有一条折线）
lines1 = plt.plot(x_data, y_data, color='red', linewidth=2.0, linestyle='--')
lines2 = plt.plot(x_data, y_data2, color='blue', linewidth=3.0, linestyle='-.')
plt.legend(handles=[lines1[0], lines2[0]], labels=['A公司销量', 'B公司销量'], loc='lower right')
# handles: 折线列表
# labels：对应的图例名称列表
# loc：图例的位置
#       best, upper right, upper left, lower left, lower right, right, 
#       center left, center right, lower center, upper center, center
plt.show()

# 添加图例的另一种方式，label在plot()函数中指定。

plt.plot(x_data, y_data, color='red', linewidth=2.0, linestyle='--', label='A公司销量')
plt.plot(x_data, y_data2, color='blue', linewidth=3.0, linestyle='-.', label='B公司销量')
plt.legend(loc='upper left')
plt.show()

# 管理坐标轴

plt.plot(x_data, y_data, color='red', linewidth=2.0, linestyle='--', label='A公司销量')
plt.plot(x_data, y_data2, color='blue', linewidth=3.0, linestyle='-.', label='B公司销量')
plt.legend(loc='upper left')
# 设置坐标轴的名称：
plt.xlabel('年份')
plt.ylabel('销量（本）')
# 设置标题：
plt.title('历年销量')
# 设置刻度：
plt.yticks(range(40000,120000,5000)) # 每5000单位一个刻度值
plt.show()

# 注：更精细的坐标轴控制可通过调用plt.gca()获取坐标抽对象、并对该对象进行设置而实现。
# 具体操作可参考matplotlib文档。

# -------------------------------------------------------------
# 多个子图

plt.figure()  # 创建一个新图
# 定义从-pi到pi之间的数据，取64个数据点：
x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True)

# 将整个figure分成两行两列，第三个参数表示将该图形放在第一个网格中
plt.subplot(2,2,1)
# 绘制正弦曲线
plt.plot(x_data, np.sin(x_data))
plt.title('正弦曲线')

# 将整个figure分成两行两列，第三个参数表示将该图形放在第二个网格中
plt.subplot(2,2,2)
# 绘制余弦曲线
plt.plot(x_data, np.cos(x_data))
plt.title('余弦曲线')

# 将整个figure分成两行两列，第三个参数表示将该图形放在第三个网格中
plt.subplot(2,2,3)
# 绘制正切曲线
plt.plot(x_data, np.tan(x_data))
plt.title('正切曲线')

# 调整子图之间的纵向间隔：
# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.4)

plt.show()

# 将上述的三个subplot函数改成：
# plt.subplot(2,1,1)
# plt.subplot(2,2,3)
# plt.subplot(2,2,4)
# 看看效果如何。


# -------------------------------------------------------------
# 图片的保存

# 方法一：在 调用plt.show() 后打开的图形窗口中选择保存。

# 方法二：直接通过调用plt.savefig() 保存（不要调用 plt.show()）：

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
plt.plot(x_data, y_data)

# 将图保存成文件。根据文件扩展名确定图片格式。
plt.savefig('my_fig.pdf')
plt.savefig('my_fig.png')
plt.savefig('my_fig.svg')  # 矢量图




















